package com.kerwin.sysmgt.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.kerwin.sysmgt.UserService;
import com.kerwin.sysmgt.entity.ConditionUser;
import com.kerwin.sysmgt.entity.User;
import com.kerwin.sysmgt.mapper.UserMapper;
import com.kerwin.utils.PassSaltMd5;
import com.kerwin.utils.TokenUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Objects;

/*接口继承了mp接口*/
/*实现类继承了mp实现类*/

/*自己的实现类  又实现了自己的接口*/
/*爆了这个夸张的错误*/

/**
 * ============================
 * CONDITIONS EVALUATION REPORT
 * ============================
 */
/*原因是service 没放进容器*/
/*为什么service接口不放进容器*/
/*ref 还记得这个属性吗 这个引用的是实现类  你放个接口进容器干嘛？？*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    /*说白了这个baseMapper就是我的UserMapper*/

    /*日志输出一下*/
    /*我怎么创建不了Logger对象啊*/
    /*只有前面有 Logger l 才能get对象*/
   private static Logger l=LoggerFactory.getLogger(UserServiceImpl.class);

    public User userLogin(String userName, String userPassword){
        QueryWrapper<User> qw = new QueryWrapper<>();
        /*记住前面的是列名*/
        /*查询条件 user_name='userName'*/
        qw.eq("user_name", userName);

//        /*先根据用户名把 加盐的md5密码查出来*/
//        qw.select("user_password");

        User user = baseMapper.selectOne(qw);

        /*如果没差到东西，直接就返回吧*/
        if(Objects.isNull(user)){
            return null;
        }
        l.info("用户登录 查询到了密码: "+user.getUserPassword());

        /*把查询出来的密码和用户传入的密码做对比*/
        Boolean passMatchResult = PassSaltMd5.verifySaltMd5Pass(userPassword, user.getUserPassword());

        System.out.println(qw.toString());

        if(passMatchResult){
            return user;
        }
        return null;
    }

    /*返回token*/
    public String setToken(String userName){
        /*根据用户名查询用户手机号*/
        /*构造器应该不能复用，执行完查询之后，构造器里面的变量并未消失*/
        QueryWrapper<User> qw = new QueryWrapper<>();
        qw.eq("user_name", userName);
        qw.select("user_phone");

        User user = baseMapper.selectOne(qw);
        if (Objects.isNull(user))
            return null;
         /*这里返回全局异常*/

        /*通过这个电话号建立一个token*/
        String userPhone = user.getUserPhone();
        String token = TokenUtil.CreatingJws(userPhone);

        return token;
    }

    /*分页插件的使用*/
    /*启动器里面已经配了 mybatis拦截器插件 拦截sql语句执行了*/
    public List<User> getUserList(){
        QueryWrapper<User> qw = new QueryWrapper<>();
        List<User> users = baseMapper.selectList(qw);
        return users;
    }

    @Override
    public List<User> getUserList(ConditionUser conditionUser) {
        String userName = conditionUser.getUserName();
        String userPhone = conditionUser.getUserPhone();
        User user = new User();
        user.setUserName(userName);
        user.setUserPhone(userPhone);
        QueryWrapper<User> qw=new QueryWrapper<>(user);

       return baseMapper.selectList(qw);
        /*我怎么return 个null回去啊*/
        /*return null;*/
    }


    /*在这里把操作记录插入数据库*/





    /*为了学习事务 故意把用户名写到21让他出错*/
    /*事务 最初的实现  是把connection放到 ThreadLocal 里面set get*/
    /*让dao层拿到的是同一个connection*/
    /*通过切面注解 创建代理  创建通知之类的把  服务层方法包起来 出问题就回滚*/

    /*这个注解只对运行时异常才回滚*/
    /*@Transactional(rollbackFor = Exception.class)*/
    /*这样受检异常也会回滚，一般不这样做*/
    /*因为这样会改变代码结构，就是service 接口会被添加一个throw 异常信息*/

    /*老师说不要改变代码结构，！！只改实现类！！*/
    /*如果找不到文件，抛出一个运行运行时异常*/

    /*或者可以接受找不到文件*/
    /*try catch起来，如果找不到文件  if(文件=null) 写处理的方法*/
    @Transactional
    public void transStudy(){
        /*添加用户*/
        User user = new User();
        user.setId("15");
        user.setUserName("aa");
        user.setUserPassword("bb");

        baseMapper.insert(user);

        User user1 = new User();
        user.setId("16");
        user.setUserName("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
        user.setUserPassword("bb");

        baseMapper.insert(user1);

    }

    public Integer addUser(User user){
        String userPassword = user.getUserPassword();
        String saltMd5 = PassSaltMd5.getSaltMd5(userPassword);
        user.setUserPassword(saltMd5);
        /*在这里把密码改了*/
        int insert = baseMapper.insert(user);

        return insert;
    }

}
